package com.hera.base.dao;

import java.io.Serializable;
import java.util.List;

import com.hera.base.util.DatoAuditoria;
import com.hera.base.util.FiltroDTO;

/**
 * @author wduran
 * Clase Base para acceder a la base de datos
 * @param <Entidad> Objeto del dominio
 * @param <TipoLlave> tipo de id del objeto
 */
public interface BaseDAO<Entidad, TipoLlave> extends Serializable {

		
		/**
		 * @param id codigo de la entidad a ser buscada
		 * @return la entidad buscada
		 */
		public Entidad obtener(TipoLlave id);

		/**
		 * @param entidad a actualizar
		 * @param datoAuditoria datos de auditoria
		 */
		public void actualizar(Entidad entidad,DatoAuditoria datoAuditoria);

		/**
		 * @param entidad
		 * @param datoAuditoria datos de auditoria
		 */
		public void crear(Entidad entidad,DatoAuditoria datoAuditoria);
		
		/**
		 * @param lstEntidad
		 * @param datoAuditoria datos de auditoria
		 */
		public void grabarTodos(List<Entidad> lstEntidad,DatoAuditoria datoAuditoria);

		/**
		 * @param entidad
		 * @param datoAuditoria datos de auditoria
		 */
		public void eliminar(Entidad entidad,DatoAuditoria datoAuditoria);

		/**
		 * @param id
		 * @param datoAuditoria datos de auditoria
		 */
		public void eliminarXId(TipoLlave id,DatoAuditoria datoAuditoria);
		
		/**
		 * @param list
		 * @param datoAuditoria datos de auditoria
		 */
		public void eliminarTodos(List<Entidad> list,DatoAuditoria datoAuditoria);

		/**
		 * @return
		 */
		public List<Entidad> obtenerTodos();

		/**
		 * @return
		 */
		public Integer contar();
		
		/**
		 * @param tipoLlave
		 * @return
		 */
		public boolean contiene(TipoLlave tipoLlave);
		
		/**
		 * @param filtroDTO
		 * @param indicadorInicioCantidad
		 * @return
		 */
		public List<Entidad> obtenerEntidadesPorFiltros(FiltroDTO filtroDTO, int... indicadorInicioCantidad);
}
